package src.BlueBridge.DeepRecursion;

/**
 * 给出集合 [1,2,3,...,n]，其所有元素共有 n! 种排列。
 *
 * 按大小顺序列出所有排列情况，并一一标记，当 n = 3 时, 所有排列如下：
 *
 * "123"
 * "132"
 * "213"
 * "231"
 * "312"
 * "321"
 * 给定 n 和 k，返回第 k 个排列。
 *
 *  
 *
 * 示例 1：
 *
 * 输入：n = 3, k = 3
 * 输出："213"
 * 示例 2：
 *
 * 输入：n = 4, k = 9
 * 输出："2314"
 * 示例 3：
 *
 * 输入：n = 3, k = 1
 * 输出："123"
 *
 */

public class _7全排列第k个排列 {
    public static void main(String[] args) {
        String s = "123";
        getPermutation(s);
    }

    // 前缀法
    final static int k = 3;
    static int count = 0;
    public static void getPermutation(String A) {
        char[] arr = A.toCharArray();
        String prefix = "";
        getPermutationCore(prefix, arr);
    }
    public static void getPermutationCore(String prefix, char[] arr) {
        if (prefix.length() == arr.length) {// 前缀的长度=字符集的长度，一个排列就完成了
            count++;
            if (count == k) {
                System.out.println("-----:" + prefix);
                System.exit(0);
            }
        }
        // 每次都从头扫描，只要该字符可用，我们就附加到前缀后面，前缀变长了
        for (int i = 0 ; i < arr.length ; i++) {
            char ch = arr[i];
            // 这个字符可用，在pre中出现的次数小于在字符集中的出现次数
            if (count(prefix.toCharArray(), ch) < count(arr, ch)) {
                getPermutationCore(prefix + ch, arr);
            }
        }
    }
    public static int count(char[] arr, char ch) {
        int cnt = 0;
        for (char c : arr) {
            if (c == ch)
                cnt++;
        }
        return cnt;
    }
}
